#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
命令行文本计数统计程序 - 基础功能版本 (v0.2)
支持字符数、单词数、句子数统计
开发环境: Visual Studio 2022
"""

import re
import sys
import argparse


class TextCounter:
    """文本计数器类"""
    
    def __init__(self, filename):
        """
        初始化文本计数器
        Args:
            filename: 要统计的文件名
        """
        self.filename = filename
        self.content = self._read_file()
    
    def _read_file(self):
        """
        读取文件内容
        Returns:
            str: 文件内容
        Raises:
            SystemExit: 文件不存在或读取错误时退出程序
        """
        try:
            # 明确指定编码为utf-8
            with open(self.filename, 'r', encoding='utf-8') as file:
                return file.read()
        except FileNotFoundError:
            print(f"错误：文件 '{self.filename}' 未找到")
            sys.exit(1)
        except Exception as e:
            print(f"读取文件时出错：{e}")
            sys.exit(1)
    
    def count_chars(self):
        """
        统计字符数（包括空格和换行符）
        Returns:
            int: 字符总数
        """
        return len(self.content)
    
    def count_words(self):
        """
        统计单词数（使用正则表达式匹配英文单词）
        Returns:
            int: 单词总数
        """
        # 使用正则表达式匹配单词（字母序列）
        words = re.findall(r'\b[a-zA-Z]+\b', self.content)
        return len(words)
    
    def count_sentences(self):
        """
        统计句子数（基于句子结束符 . ! ?）
        Returns:
            int: 句子总数
        """
        # 使用正则表达式匹配句子结束符
        sentences = re.findall(r'[^.!?]*[.!?]', self.content)
        return len(sentences) if sentences else 0
    
    def count_lines(self):
        """
        统计行数
        Returns:
            int: 总行数
        """
        return self.content.count('\n') + 1 if self.content else 0


def main():
    """
    主函数 - 处理命令行参数并执行统计
    """
    # 创建参数解析器
    parser = argparse.ArgumentParser(
        description='文本计数统计程序 - 统计文本文件的字符数、单词数、句子数',
        epilog='示例: wc_counter -c -w file.txt'
    )
    
    # 添加命令行参数
    parser.add_argument(
        'filename',
        help='要统计的文本文件名'
    )
    
    parser.add_argument(
        '-c', '--chars',
        action='store_true',
        help='统计字符数'
    )
    
    parser.add_argument(
        '-w', '--words',
        action='store_true',
        help='统计单词数'
    )
    
    parser.add_argument(
        '-s', '--sentences',
        action='store_true',
        help='统计句子数'
    )
    
    parser.add_argument(
        '-l', '--lines',
        action='store_true',
        help='统计行数'
    )
    
    parser.add_argument(
        '-a', '--all',
        action='store_true',
        help='显示所有统计信息'
    )
    
    # 解析命令行参数
    args = parser.parse_args()
    
    # 创建计数器实例
    counter = TextCounter(args.filename)
    
    # 根据参数执行相应的统计
    results = []
    
    if args.chars or args.all:
        char_count = counter.count_chars()
        results.append(f"字符数: {char_count}")
    
    if args.words or args.all:
        word_count = counter.count_words()
        results.append(f"单词数: {word_count}")
    
    if args.sentences or args.all:
        sentence_count = counter.count_sentences()
        results.append(f"句子数: {sentence_count}")
    
    if args.lines or args.all:
        line_count = counter.count_lines()
        results.append(f"行数: {line_count}")
    
    # 如果没有指定任何参数，默认显示所有基本信息
    if not any([args.chars, args.words, args.sentences, args.lines, args.all]):
        char_count = counter.count_chars()
        word_count = counter.count_words()
        sentence_count = counter.count_sentences()
        line_count = counter.count_lines()
        
        results.extend([
            f"字符数: {char_count}",
            f"单词数: {word_count}",
            f"句子数: {sentence_count}",
            f"行数: {line_count}"
        ])
    
    # 输出结果
    print(f"文件: {args.filename}")
    for result in results:
        print(result)


# VS 2022 入口点配置
if __name__ == '__main__':
    main()